#include "widget.h"
#include "ui_widget.h"
#include "databasemanager.h"
#include "mainwindow.h"
#include <QTimer>
#include <QCoreApplication>
#include <QString>
#include <QStringList>
extern DatabaseManager dbManager;

Widget::Widget(QWidget *parent)
    :QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->accountEdit->setSelection(0, 0);
    ui->passwdEdit->setSelection(0, 0);
    ui->passwdEdit->setEchoMode(QLineEdit::Password);
}

Widget::~Widget()
{
    delete ui;
}

// 转向注册窗口
void Widget::on_pushButton_register_clicked()
{
    RegisterWin* registerWindow = new RegisterWin(this);
    registerWindow->exec();
}

//登陆时 也要查看是用户名+密码还是手机号+密码
void Widget::on_pushButton_login_clicked()
{
    QString account = ui->accountEdit->text();
    QString password = ui->passwdEdit->text();

    QString phone;
    QString usrname;

    // 账号以数字1开头 用户输入的账号是手机号
    if (account.startsWith('1'))
    {
        phone = account;  // 保存到手机号变量

        // 手机号+密码不为空
        if (phone.isEmpty()  || password.isEmpty())
        {
            QMessageBox::warning(this, "警告", "手机号和密码不能为空");
            return;
        }

        // 手机号密码匹配 进入新界面
        if(dbManager.loginInputMatches(account, password))
        {
            dbManager.updateLoginTime(account);
            QMessageBox::information(this, "Login Success", "登陆成功！", QMessageBox::Ok);

            // 账号 密码匹配 该用户一定存在 获取用户ID
            int usrID = dbManager.getIdByAccount(account);
            // 创建主窗口实例
            MainWindow *  mainWindow = new MainWindow(nullptr, usrID);
            mainWindow->show();
            // 关闭当前登录窗口
            QTimer::singleShot(1000, this, &QWidget::close); // 1秒后关闭登录窗口
        }
        // 手机号和密码不匹配 提示用户即可
        else
        {
            QMessageBox::warning(this, "警告", "手机号和密码不匹配");
        }
    }
    // 账号不以数字1开头 用户输入的账号是用户名
    else
    {
        usrname = account;  // 保存到用户名变量

        // 用户名+密码不为空
        if (usrname.isEmpty()  || password.isEmpty())
        {
            QMessageBox::warning(this, "警告", "用户名和密码不能为空");
            return;
        }

        // 用户名密码匹配 进入新界面
        if(dbManager.loginInputMatches(usrname, password))
        {
            //主界面
            dbManager.updateLoginTime(account);
            QMessageBox::information(this, "登录提示", "登录成功！", QMessageBox::Ok);

            // 账号 密码匹配 该用户一定存在 获取用户ID
            int usrID = dbManager.getIdByAccount(account);
            // 创建主窗口实例
            MainWindow * mainWindow = new MainWindow(nullptr, usrID);
            mainWindow->show();
            // 关闭当前窗口
            QTimer::singleShot(1000, this, &QWidget::close); // 3秒后关闭登录窗口
        }
        // 手机号和密码不匹配 提示用户即可
        else
        {
            QMessageBox::warning(this, "警告", "用户名和密码不匹配");
        }

    }

}

// 隐藏或显示密码
void Widget::on_pushButton_clicked()
{
    // 切换 QLineEdit 的 echoMode
    if (ui->passwdEdit->echoMode() == QLineEdit::Password)
        ui->passwdEdit->setEchoMode(QLineEdit::Normal);
    else
        ui->passwdEdit->setEchoMode(QLineEdit::Password);
}

//用户输入了账号(手机号或密码) 去数据库查找 没找到提示用户先注册
void Widget::on_accountEdit_editingFinished()
{
    //const QString Sqlpath = QCoreApplication::applicationDirPath() + "/plugins";
    //QMessageBox::information(this, "debug msg", Sqlpath);

    if (!dbManager.db.isOpen())
    {
        const QString sqlError = dbManager.db.lastError().text();
        QMessageBox::warning(this, "错误", sqlError);

        QString testSqlDrivers;
        QStringList drivers = QSqlDatabase::drivers();
        foreach (QString driver, drivers)
            testSqlDrivers += driver;
        QMessageBox::information(this, "sql drivers", testSqlDrivers);

        return;
    }
    else
    {
        // QMessageBox::information(this, "提示", "数据库连接成功！");
    }

    // 检查输入是否以数字1开头
    QString input = ui->accountEdit->text();
    QString phone;
    QString usrname;
    if (input.startsWith('1'))
    {
        phone = input;  // 保存到手机号变量
        QRegularExpression phoneRegex(R"(^1\d{10}$)");
        QRegularExpressionValidator *phoneValidator = new QRegularExpressionValidator(phoneRegex, this);
        ui->accountEdit->setValidator(phoneValidator);
        QRegularExpressionMatch match = phoneRegex.match(phone);

        if (!match.hasMatch())
        {
            // 如果手机号不符合要求 弹出警告框
            QMessageBox::warning(this, "Invalid Phone Number", "手机号需要1开头+10数字", QMessageBox::Ok);
            return;
        }

        if(!dbManager.isUserExistByPhone(phone))
        {
            QMessageBox::information(this, "提示", "当前用户不存在，请先注册账号");
            return;
        }
    }
    else
    {
        usrname = input;  // 保存到用户名变量
        if(!dbManager.isUserExistByUsrName(usrname))
        {
            QMessageBox::information(this, "提示", "当前用户不存在，请先注册账号");
            return;
        }
    }
}
